iT邦幫忙

2023 iThome 鐵人賽

DAY 0
0
自我挑戰組

從零到全端:轉職者的 To-Do List 技能之旅系列 第 9

從零到全端:轉職者的 To-Do List 技能之旅-後端開發- 完成 Task API

  • 分享至 

  • xImage
  •  

今日目標

使用 Flask-RESTX 設定 Task API 的輸入輸出規格
使用 Flask-RESTX 建立 Task Update API 並測試
使用 Flask-RESTX 建立 Task Create API 並測試
新的一個禮拜開始了!大家一起加油,往目標邁進!!!/images/emoticon/emoticon08.gif

利用 Flask-RESTX 設定 Task API 的輸入輸出規格

  • 利用我們的 Task API 文件規格,來設定 API 需要的輸入輸出規格
    • 需要的有:id、member_id、title、priority、state、start、deadline、description
    • 在我們的資料庫設定中,只有 member_id、title 是必須的
    • 在 Update API 的輸入中還需要用來指定任務的 task id
    • 根據 Flask-RESTX 提供的 Data Formatting 來設定輸入輸出的 model
      # Update 輸入
      task_update_model = api.model("TaskUpdate", {
        "id": fields.Integer,
        "member_id": fields.Integer,
        "title": fields.String,
        "priority": fields.String(required=False),
        "state": fields.String(required=False),
        "start": fields.DateTime(required=False),
        "deadline": fields.DateTime(required=False),
        "description": fields.String(required=False)
      })
      
      # Update 輸出、Create API 的輸入輸出
      task_model = api.model("Task", {
        "id": fields.Integer(required=False),
        "member_id": fields.Integer,
        "title": fields.String(required=True),
        "priority": fields.String(required=False),
        "state": fields.String(required=False),
        "start": fields.DateTime(required=False),
        "deadline": fields.DateTime(required=False),
        "description": fields.String(required=False)
      })
      

使用 Flask-RESTX 建立 Task Update API 並測試

  • Task Update 的邏輯流程:
    • 利用 task_update_model 規定輸入規格

    • 利用前端輸入的 task id 取得 task

    • 利用前端輸入的資料建立更新用的 update_data

    • 利用 update_data 更新 task,並將結果 commit

    • 利用 task_model 將 task JSON 格式化後回傳

      # tasks_controller.py
      @tasks_ns.expect(task_update_model) # 輸入
      @tasks_ns.marshal_with(task_model)  # 輸出
      def put(self, id):
        "Update Task"
        task = get_task_by_id(id)
        update_data = get_task_data(tasks_ns)
        task = update_task(task, update_data)
        return task, 200
      
      
      # tasks_model.py      
      def get_task_by_id(id):
        return Task.query.get(id)
      
      def update_task(task, update_data):
          for key, value in update_data.items():
            if value is not None:
              setattr(task, key, value)
          db.session.commit()
          return task
      
      def get_task_data(tasks_ns):
        return {
          "member_id": tasks_ns.payload.get("member_id"),
          "title": tasks_ns.payload.get("title"),
          "priority": tasks_ns.payload.get("priority"),
          "state": tasks_ns.payload.get("state"),
          "start": tasks_ns.payload.get("start"),
          "deadline": tasks_ns.payload.get("deadline"), 
          "description": tasks_ns.payload.get("description") 
        }
      
    • 在思考該如何更新資料的時候找到了 setattr() 這個好用的函數,直接給定 object、key、value,就能夠建立鍵值對,相當方便!

  • 測試 API
    • 上圖
      https://ithelp.ithome.com.tw/upload/images/20230925/20162291S5HYTyP6aQ.png
      https://ithelp.ithome.com.tw/upload/images/20230925/20162291CG2l28b8bb.png
    • GOOD!
    • 關於日期格式的問題,因為建立資料庫的時候用了 DATETIME 格式:YYYY-MM-DD hh:mm:ss
    • 但後來發現其實我只需要到日期就好,所以導致需要轉換,這部分會在前端修改之後在打 API 給後端

使用 Flask-RESTX 建立 Task Create API 並測試

  • Task Create 的邏輯流程:

    • 利用 task_model 規定輸入規格
    • 利用前端輸入的 task id 取得 task
    • 利用前端輸入的資料建立更新用的 new_task
    • 利用 update_data 建立新的 task,並將結果 commit
    • 利用 task_model 將 task JSON 格式化後回傳
      # tasks_controller.py
      @tasks_ns.expect(task_model)
      @tasks_ns.marshal_with(task_model)
      def post(self):
        "Create New Task"
        new_task = get_task_data(tasks_ns)
        task = add_task(new_task)
        return task
      
      
      # tasks_model.py
      def add_task(newTask):
      task = Task(**newTask)
      db.session.add(task)    # 將物件加入到資料庫會話中
      db.session.commit()  
      return task
      
  • 測試 API

    • 上圖
      https://ithelp.ithome.com.tw/upload/images/20230925/20162291PqG4VyASge.png
      https://ithelp.ithome.com.tw/upload/images/20230925/20162291GjT24RDW78.png

回顧、預告

到目前為止我們 Task 的 API 都已經完成了
接下來就要進入 member 的部分了,同時還會用到 JWT 來做會員驗證!/images/emoticon/emoticon34.gif


上一篇
從零到全端:轉職者的 To-Do List 技能之旅-後端開發- Flask-RESTX
下一篇
從零到全端:轉職者的 To-Do List 技能之旅-後端開發- Member API-1
系列文
從零到全端:轉職者的 To-Do List 技能之旅15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言